【剑指Offer I】19. 正则表达式匹配
题目
请实现一个函数用来匹配包含'. '
和'*'
的正则表达式。模式中的字符'.'
表示任意一个字符,而'*'
表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"
与模式"a.a"
和"ab*ac*a"
匹配,但与"aa.a"
和"ab*a"
均不匹配。
解答
二维动态规划
定义状态
dp[i][j]
表示 s
的前 i
个字符与 p
中的前 j
个字符是否能够匹配。
初始状态:
dp[0][0] = 1
,都是空串可以匹配成功s
是空串时,p
若不为空必须用*
抵消前一个字符
状态转移方程
注意字符串索引对应dp矩阵索引-1。
- 当
p[j - 1] = '*'
时,dp[i][j]
在当以下任一情况为true
时等于true
:
dp[i][j - 2]
: 即将字符组合p[j - 2]*
看作出现 0 次时,能否匹配;dp[i - 1][j]
且s[i - 1] = p[j - 2]
: 即让字符p[j - 2]
多出现 1 次时,能否匹配;dp[i - 1][j]
且p[j - 2] = '.'
: 即让字符'.'
多出现 1 次时,能否匹配;
- 当
p[j - 1] != '*'
时,dp[i][j]
在当以下任一情况为true
时等于true
:
dp[i - 1][j - 1]
且s[i - 1] = p[j - 1]
: 即让字符p[j - 1]
多出现一次时,能否匹配;dp[i - 1][j - 1]
且p[j - 1] = '.'
: 即将字符'.'
看作字符s[i - 1]
时,能否匹配;
最终答案:dp[m][n]
代码
1 | class Solution { |
复杂度
- 时间复杂度 $O(m*n)$
- 空间复杂度 $O(m*n)$
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 namespace LANG!
评论